package com.atguigu.tingshu.config;

import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


@Configuration
public class CancelOrderMqConfig {

    /**
     * 配置取消订单交换机
     * 该方法创建并返回一个自定义交换机，用于处理带有延迟的取消订单消息
     * 通过设置交换机的类型为“x-delayed-message”和延迟类型为“direct”，
     * 可以实现消息的延迟发送和定向路由
     *
     * @return CustomExchange 返回一个自定义交换机实例，用于处理取消订单的延迟消息
     */
    @Bean
    public CustomExchange cancelOrderExchange()
    {
        // 创建一个用于存储交换机参数的映射
        Map<String, String> map=new HashMap<>();
        // 设置延迟类型为 direct
        map.put("x-delayed-type", "direct");

        // 返回一个新的自定义交换机实例
        // 参数包括交换机名称、交换机类型、是否持久化和是否自动删除
        // 其中，MqConst.EXCHANGE_CANCEL_ORDER 为交换机名称，"x-delayed-message" 为交换机类型，
        // true 表示持久化，false 表示不自动删除
        return new CustomExchange(MqConst.EXCHANGE_CANCEL_ORDER, "x-delayed-message", true, false);
    }
    @Bean
    public Queue cancelOrderQueue()
    {
        return new Queue( MqConst.QUEUE_CANCEL_ORDER,true, true, false);
    }
    @Bean
    public Binding cancelOrderBinding()
    {
        // 创建一个绑定对象，将取消订单队列绑定到取消订单交换机上，并指定路由键为 MqConst.ROUTING_CANCEL_ORDER
      return BindingBuilder.bind(cancelOrderQueue()).to(cancelOrderExchange()).with(MqConst.ROUTING_CANCEL_ORDER).noargs();
    }

}
